package com.yuntsg.subject_database.component;

import com.yuntsg.subject_database.entity.PublicEntity;
import com.yuntsg.subject_database.servic.SubjectDatabaseUnit;
import com.yuntsg.subject_database.servic.SubjectDatabaseWord;
import com.yuntsg.subject_database.util.OftenUtils;
import com.yuntsg.subject_database.util.PublicUtils;
import com.yuntsg.subject_database.util.SmallTool;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component//先声明是一个spring组件
@Data
public class SubjectDatabaseComponent {


//    @Value("${myproperties.db}")
//    protected String db;


    // 获取标准的单位名称以及标准的部门名称，建成Map，结构为：类型（hosp,univ,dept），自由的词，对应标准的词（top、lower、anyContain、mustExclude）
    Map<String, Map<String, PublicEntity.TopLower>> ruleMap = new ConcurrentHashMap<>(); //类型、自由词、规范后的词（两个） univ -> 四川轻化工大学 -> (top=四川轻化工大学, lower=, anyContain=[], mustExclude=[])
    Map<String, Map<String, List<SubjectDatabaseUnit.NsfcInfo>>> nsfcInfoMap = null; // 获取国自然科学基金数据
    Map<String, Map<String, SubjectDatabaseWord.RankScore>> rankScoreMap = null; // 排名（世界大学、世界医院、中国大学、中国医院以及复旦医院排行榜中的医院）的相关得分，结构：专科、单位名称、相关得分
    Map<String, Map<String, Double>> fuDanSpecialistMap = null;


    String uniteTable = "scholar_24_07.result_core_paper_unite";
    String ruleTable = "scholar.rule_unit_0107";
    String saveTable = "scholar.result_subject_database";
    String fuDanTable = "scholar.help_fudan_hospital_ranking_list_2020";
    String nsfcTable = "scholar.data_fund_zhang_2023_04_11";


    @PostConstruct //在运行web项目之前，先执行这一块代码
    public void ReadTable() throws Exception {
        SmallTool.printMess("进行读表存表 国自然 复旦排行");
        SmallTool.printMemory();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long t0 = System.currentTimeMillis();

//        Db.use().execute("truncate table " + saveTable);

        String limit = "";
//        String limit = " limit 1";
        Integer onePageNum = 1000;
        System.out.println(format.format(new Date()) + " 程序开始启动 ~~~~~~ ");

        // 获取标准的单位名称以及标准的部门名称，建成Map，结构为：类型（hosp,univ,dept），自由的词，对应标准的词（top、lower、anyContain、mustExclude）
        PublicUtils.getStandardUnit(ruleTable, ruleMap); // 获取规范名称
        System.out.println(format.format(new Date()) + " ② ruleMap.size()：" + ruleMap.size());
        OftenUtils.printMemory();

        // 获取国自然科学基金数据，结构为：单位；作者、信息List
        String fundField = "var2`,`year`,`var7`,`var5`,`var6";
        nsfcInfoMap = SubjectDatabaseUnit.readNsfcTable(nsfcTable, onePageNum, fundField, limit, "id", ruleMap, false); // 获取国自然科学基金数据
        System.out.println(format.format(new Date()) + " ③ nsfcInfoMap.size()：" + nsfcInfoMap.size());
        OftenUtils.printMemory();

        fuDanSpecialistMap = SubjectDatabaseWord.readFuDanRank(fuDanTable); // 复旦的专科声誉，结构为专科名称、医院名称、医院得分
        System.out.println(format.format(new Date()) + " ④ fuDanSpecialistMap.size()：" + fuDanSpecialistMap.size());
        OftenUtils.printMemory();

        rankScoreMap = SubjectDatabaseWord.getUnitRank(ruleTable, fuDanSpecialistMap);// 排名（世界大学、世界医院、中国大学、中国医院以及复旦医院排行榜中的医院）的相关得分
        System.out.println(format.format(new Date()) + " ⑤ rankScoreMap.size()：" + rankScoreMap.size());
        OftenUtils.printMemory();

        long t3 = System.currentTimeMillis();
        System.out.println(format.format(new Date()) + " 程序启动成功，用时：" + OftenUtils.Arith.div((t3 - t0), 1000) + " 秒。");


//        upDataCorePaperUnite.main();

    }


}
